/*!
 * \file WtCtaTicker.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief CTA实时行情处理器头文件
 * 
 * 本文件定义了CTA实时行情处理器类，主要功能包括：
 * - 实时行情数据接收和处理
 * - 时间驱动的K线周期管理
 * - 交易时段控制和时间同步
 * - 分钟线闭合事件触发
 * - 主力合约和次主力合约处理
 * 
 * WtCtaRtTicker是CTA引擎的核心组件之一，负责将实时行情数据
 * 按照交易时段规则进行时间驱动处理，确保策略在正确的时间点
 * 接收到准确的行情数据和K线闭合事件。
 */
#pragma once
#include <stdint.h>
#include <atomic>

#include "../Includes/WTSMarcos.h"
#include "../Share/StdUtils.hpp"

NS_WTP_BEGIN
class WTSSessionInfo;
class IDataReader;
class WTSTickData;

class WtCtaEngine;
//////////////////////////////////////////////////////////////////////////
//����ʱ�䲽����
/**
 * @class WtCtaRtTicker
 * @brief CTA实时行情处理器类
 * 
 * CTA实时行情处理器是CTA引擎的核心时间驱动组件，主要功能包括：
 * 1. 实时行情数据处理：接收和转发实时tick数据
 * 2. 时间驱动管理：根据交易时段规则管理时间流
 * 3. K线周期控制：触发分钟线闭合事件
 * 4. 主力合约处理：自动处理主力和次主力合约切换
 * 5. 交易时段同步：确保引擎时间与市场时间同步
 * 6. 数据存储协调：与数据存储模块协调K线数据写入
 * 
 * 该类采用多线程设计，使用独立线程进行时间检查和事件触发，
 * 确保在没有行情数据时也能正常触发时间事件。
 */
class WtCtaRtTicker
{
public:
	/**
	 * @brief 构造函数
	 * @param engine CTA引擎指针
	 * 
	 * 初始化CTA实时行情处理器，设置引擎引用和初始状态
	 */
	WtCtaRtTicker(WtCtaEngine* engine) 
		: _engine(engine)
		, _stopped(false)
		, _date(0)
		, _time(UINT_MAX)
		, _next_check_time(0)
		, _last_emit_pos(0)
		, _cur_pos(0){}
	~WtCtaRtTicker(){}

public:
	/**
	 * @brief 初始化行情处理器
	 * @param store 数据存储接口指针
	 * @param sessionID 交易时段ID
	 * 
	 * 设置数据存储接口和交易时段信息，准备开始处理行情数据
	 */
	void	init(IDataReader* store, const char* sessionID);
	//void	set_time(uint32_t uDate, uint32_t uTime);
	/**
	 * @brief 处理实时行情数据
	 * @param curTick 当前tick数据
	 * @param hotFlag 热点标志(0-普通合约,1-主力合约,2-次主力合约)
	 * 
	 * 接收实时tick数据，进行时间驱动处理，触发相应的引擎事件
	 */
	void	on_tick(WTSTickData* curTick, uint32_t hotFlag = 0);

	/**
	 * @brief 启动行情处理器
	 * 
	 * 启动独立的时间检查线程，开始时间驱动处理
	 */
	void	run();
	/**
	 * @brief 停止行情处理器
	 * 
	 * 停止时间检查线程，结束行情处理
	 */
	void	stop();

	/**
	 * @brief 判断是否在交易时间内
	 * @return 是否在交易时间内
	 * 
	 * 根据当前时间和交易时段信息判断是否处于交易时间
	 */
	bool		is_in_trading() const;
	/**
	 * @brief 将时间转换为分钟数
	 * @param uTime 时间(HHMMSS格式)
	 * @return 分钟数
	 * 
	 * 将HHMMSS格式的时间转换为从交易开始的分钟数
	 */
	uint32_t	time_to_mins(uint32_t uTime) const;

private:
	/**
	 * @brief 触发价格事件
	 * @param curTick 当前tick数据
	 * @param hotFlag 热点标志
	 * 
	 * 将tick数据转发给CTA引擎，处理主力合约和次主力合约
	 */
	void	trigger_price(WTSTickData* curTick, uint32_t hotFlag = 0);

private:
	WTSSessionInfo*	_s_info;
	WtCtaEngine*	_engine;
	IDataReader*	_store;

	uint32_t	_date;
	uint32_t	_time;

	uint32_t	_cur_pos;

	StdUniqueMutex	_mtx;
	std::atomic<uint64_t>	_next_check_time;
	std::atomic<uint32_t>	_last_emit_pos;

	bool			_stopped;
	StdThreadPtr	_thrd;

};
NS_WTP_END